/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __DATA_STRUCT_TASK_H__
#define __DATA_STRUCT_TASK_H__

#include "../tools/thread_lock.h"
#include "module.h"

namespace xos_http
{
    class connection;
    class response;
    class request;
    class port;
    class host;
    class path;
    class file;

    class task : public xos_stl::mem_item< xos::release_impl< task >, thread_lock >,
        public http::i_task
    {
    public:
        enum enumState
        {
            STATE_PREPARE,
            STATE_FILTER_BEFORE,
            STATE_FILTER_AFTER,
            STATE_DOWNLOAD_FILE,
            STATE_PROC_TASK,
            STATE_PROC_XOS,
            STATE_DONE
        };
    public:
        typedef std::list< std::string > STR_LIST;
        typedef xos::release_impl< task > T;

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        task();
        ~task();

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static int get_xos_item_data( ITEM_DATA*& item_ptr );

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // http::i_task方法
        int set_connect( http::i_connect * pConnect );
        http::i_response * http_response();
        http::i_request * http_request();
        http::i_connect * get_connect();

        const char * super_variable( const char * lpszName );
        xos_box::i_str_property * values();
        xos_box::i_str_property * prop();

        int call( const char * lpszUri );

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        int get_task_info_from_http();
        int reset_filter_iters();
        int reset_uri_iters();
        int push();
        int pop();

    public:
        connection * m_pConnect;
        response * m_pResponse;
        request * m_pRequest;

        std::string m_host_name;
        std::string m_host_port;
        std::string m_host_ip;

        module::LIST::reverse_iterator m_filter_list_riter;
        module::LIST::iterator m_filter_list_iter;
        module::LIST m_filter_list;

        STR_LIST::iterator m_uri_list_iter;
        STR_LIST m_uri_list;

        // 没有所有权
        // 这四个是调用前需要保存的现场参数
        http::i_servlet * m_pServlet;
        module * m_pModule;
        enumState m_eState;

        // 异步调用前的参数保存，以便调用完成恢复现场
        xos_box::i_list * m_pCallStackList;

        port * m_pPort;
        host * m_pHost;
        path * m_pRoot;
        path * m_pPath;
        path * m_pSsl;

        // 下载的文件
        std::string m_full_download_gz_file;
        std::string m_full_download_file;
        std::string m_full_uri;
        std::string m_uri;
        std::string m_name;
        std::string m_ext;

        task::ITER m_iter_in_file;
        file * m_pDownloadFile;

        // property
        xos_box::i_str_property * m_pProperty;
        xos_box::i_str_property * m_pValues;

    protected:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        int init_data();

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        int init();
        int term();

    };
} // xos_http

#endif // __DATA_STRUCT_TASK_H__
